﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Configuration;
using Syntezator_mowy.Extras;
using System.Text.RegularExpressions;

namespace Syntezator_mowy.DataReader
{
    public class DataReader
    {
        private SynchrBuffer<string> bufor;
        private string sciezkaDoPliku;
        private int rozmiarBloku;

        private int waitingTime;

        public DataReader(ParametryLaczenia parametry )
        {
            this.bufor = parametry.Bufor;
            this.sciezkaDoPliku = parametry.PlikWyjsciowy;

            this.rozmiarBloku = int.Parse(ConfigurationManager.AppSettings["syntezator_rozmiarBufora"].ToString());
            this.waitingTime = int.Parse(ConfigurationManager.AppSettings["dataReader_waitingTime"].ToString());
        }

        public void run()
        {
            using (StreamReader reader = new StreamReader(this.sciezkaDoPliku, Encoding.Default))
            {
                int filePosition = 0;
                int length = (int)reader.BaseStream.Length;
                while (filePosition < length)
                {
                    char[] blokDanych = utworzBuforNaDane(length, filePosition);
                    string przekazywaneDane = pobierzBlokDanych(reader, ref filePosition, blokDanych);

                    this.bufor.dodaj(przekazywaneDane);
                    Thread.Sleep(this.waitingTime);
                }
            }
        }

        private string pobierzBlokDanych(StreamReader reader, ref int filePosition, char[] blokDanych)
        {
            filePosition += reader.Read(blokDanych, 0, blokDanych.Length);

            string przekazywaneDane = new string(blokDanych);
            pobierzBrakujaceLitery(ref reader, ref filePosition, ref przekazywaneDane);

            return przekazywaneDane;
        }

        private void pobierzBrakujaceLitery(ref StreamReader reader, ref int filePosition, ref string przekazywaneDane)
        {
            string litery = "";
            char[] znak = new char[1];
            znak[0] = ' ';

            while ((reader.Peek() >= 0) && (!this.czyZnakKonczacy(znak[0])))
            {
                reader.Read(znak, 0, 1);
                litery += znak[0];
            }

            przekazywaneDane += litery;
            filePosition += litery.Length;
        }

        private char[] utworzBuforNaDane(int length, int filePosition)
        {
            int iloscZnakowDoPobrania;
            if (filePosition + this.rozmiarBloku < length)
                iloscZnakowDoPobrania = this.rozmiarBloku;
            else
                iloscZnakowDoPobrania = (int)(length - filePosition);
            char[] blokDanych = new char[iloscZnakowDoPobrania];
            return blokDanych;
        }

        private bool czyZnakKonczacy(char znak)
        {
            switch (znak)
            {
                case '.':
                    return true;
                case ',':
                    return true;
                case '?':
                    return true;
                case '!':
                    return true;
                default:
                    return false;
            }
        }

    }
}
